package A0409;

import A0319.Test;

import java.util.*;

public class A0409 implements Test1 {
    public static void main(String[] args) { // 主函数是静态的
//        Test1.fun();
        Object o = new A0409();
        A0409 a = new A0409();
        System.out.println(a.toString());//打印结果A0409.A0409@b4c966a 对象（实例）在jvm中所处的内存地址
//        a.fun1();
        List<Integer> list1 = new ArrayList<Integer>();//左父右子，ArrayList这是一个底层是数组的线性表
        List<Integer> list2 = new LinkedList<Integer>();//左父右子,LinkedList是一个底层是链表的线性表
//        通过向上转型，将List1和list2都转为了父类List，这样就可以通过父类list来实现多态
        for(int i=0;i<10;i++){
            list1.add(i);
            list2.add(i*2);
        }
        System.out.println(a.add(list1));
        System.out.println(a.add(list2));
//        Set<Integer> set1 = new HashSet<Integer>();//底层是哈希表的一种集合
        Set<Integer> set2 = new TreeSet<>();//底层是树一种集合
        TreeSet<Integer> treeSet = new TreeSet<>();
//        set2 = (TreeSet<Integer>) set2;
        ((TreeSet<Integer>) set2).floor(2);//也可以这样创建一个临时的对象来调用子类独有的方法
        TreeSet<Integer> treeSet2 = (TreeSet<Integer>) set2;//教材中的向下转型的方式
        treeSet2.floor(3);
        treeSet.floor(2);
//        set2.floor(2); 子类向上转型为父类之后，会丢失子类所独有的方法
        //二分查找可以深入到查找 （1）大于（大于等于）某个数的最小值 （2)小于（小于等于）某个数的最大值
        Person a1 = new Person("张三","001");
        Person a2 = new Person("张四","001");
        System.out.println(a1.equals(a2));
    }

    @Override
    public void fun1() {
        System.out.println("这里实现了接口的未定义方法");
    }

    public int add(List<Integer> list){//体现多态的一个例子
        boolean flag = false;
        if(list instanceof LinkedList){ //instanceof用于判断对象属于什么类
            System.out.println("这是一个链表");
        }else if(list instanceof ArrayList){
            System.out.println("这是一个顺序表");
        }
        int ans = 0;
        for(int i=0;i<list.size();i++){
            ans += list.get(i);//多态体现在list.get(i);
        }
        return ans;
    }

    @Override
    public String toString() {
        return "我调用了toString方法";
    }
}
